import {  UNIT_BAJ_ATTR_CONFIG, UnitBAJAttrVal, indexOfBinAttrKey } from "../../config/UnitFieldConfig";
import { KeyUnitStatB, KeyUnitStatHpMpKey } from "../../types/L_Type";
import UnitX from "../../entity/UnitX";
import * as CJD from "../../types/define"
import L_Math from "../../utils/L_Math";


/**
 * 改变单位的属性执行器
 */
export default class UnitAttrChangeEx{

/**
 * 设置单位常规二进制管理属性
 * @param unitx 单位对象Unit
 * @param attrConfig 要改变的属性枚举
 * @param cur_v 设置的值（注意是基于单位自定义属性全局的量）
 */
public static setUnitStatBByUnitx(unitx:UnitX,statKey:KeyUnitStatB,cur_v:number){
    this.setUnitStatB(unitx.unit,statKey,cur_v);
}    



/**
 * 设置单位常规二进制管理属性
 * @param unitHandle 单位句柄
 * @param attrConfig 要改变的属性枚举
 * @param cur_v 设置的值（注意是基于单位自定义属性全局的量）
 */
public static setUnitStatB(unitHandle:unit,statKey:KeyUnitStatB,cur_v:number){

    let config:UnitBAJAttrVal=UNIT_BAJ_ATTR_CONFIG[statKey]
    if(indexOfBinAttrKey(statKey) ) {
        //二进制技能控制的属性
        this.setUnitStatByBinary(unitHandle,config,cur_v);
     }else{
        console.log("setUnitStatB()调用异常,错误的类型statKey:",statKey)
     }
}   

/**
 * 设置单位HP，MP增量
 * @param unitx 单位对象Unit
 * @param attrConfig 要改变的属性枚举（注意只能是JFieldConfig约束类型）
 * @param cur_v 增量值
 */
public static incUnitStatHpMpByUnitx(unitx:UnitX,statKey:KeyUnitStatHpMpKey,change_v:number){
    this.incUnitStatHpMp(unitx.unit,statKey,change_v)
}

/**
 * 设置单位HP，MP增量
 * @param unitHandle 单位句柄GetHandleId
 * @param statKey 要改变的属性枚举（注意只能是JFieldConfig约束类型）
 * @param cur_v 增量值
 */
public static  incUnitStatHpMp(unitHandle:unit,statKey:KeyUnitStatHpMpKey,change_v:number){
   // console.log("incUnitStatHpMp()被调用:",unitHandle,",",statKey,",",change_v)

    //let config:UnitBAJAttrType=UNIT_BAJ_ATTR_CONFIG[statKey] as UnitBAJAttrType
    // if(config==null ){
    //     console.log("incUnitStatHpMp()调用异常,错误的类型statKey:",statKey)
    //     return
    // }
    if(statKey==UNIT_BAJ_ATTR_CONFIG.hp.key ){
        let origin_v=GetUnitState(unitHandle,CJD.UNIT_STATE_MAX_LIFE())
        SetUnitState(unitHandle,CJD.UNIT_STATE_MAX_LIFE(),origin_v+change_v)    
    }else if( statKey==UNIT_BAJ_ATTR_CONFIG.mp.key ){
        let origin_v=GetUnitState(unitHandle,CJD.UNIT_STATE_MAX_MANA())
        SetUnitState(unitHandle,CJD.UNIT_STATE_MAX_MANA(),origin_v+change_v)    
        
    }else{
        console.log("incUnitStatHpMp()调用异常,错误的类型statKey:",statKey)
    }
}



/**
 * 二进制方法设置单位额外属性
 * @param unitHandle 
 * @param attrConfig 
 * @param v 
 */
private static  setUnitStatByBinary(unitHandle:unit,attrConfig:UnitBAJAttrVal,v:number){
    //console.log("setUnitStatByBinary()被调用:",unitHandle,",",attrConfig,",",v)
    let fv=v
    if (fv<0) {
        fv=attrConfig.max+v
    }

    let binArr=L_Math.getBINArr(fv) //低位到高位的位值数组
   // console.log(">>>10进制值:",fv)
   // console.log(">>>2进制数组:",L_String.getObjJSONStr(binArr))
    let field_id_prefix=attrConfig.id_prefix
    let maxBitNum=attrConfig.bitnum+1
   
    let mabid=null
    if(maxBitNum<10){
        mabid=field_id_prefix+'0'+tostring(maxBitNum)
    }else{
        mabid=field_id_prefix+tostring(maxBitNum)
    }

    //先移除负数技能 防止力量改变意外死亡等
    if (v>=0) {
        UnitRemoveAbility(unitHandle,L_Math.ID2I(mabid))      
       // console.log("---技能:",mabid)
    }    

    for (let i=0;i<=attrConfig.bitnum;i++ ){
        let binAblv=binArr[i] || -1
        let abid=field_id_prefix
        let luaIndex=i+1
        if (luaIndex<10) {
            abid=abid+'0'+luaIndex
        }else{
            abid=abid+''+luaIndex         
        }   
        if ( binAblv== 1 ) {
            UnitAddAbility(unitHandle,L_Math.ID2I(abid)) 
            //console.log("+++技能:",abid)
        }else{
            UnitRemoveAbility(unitHandle,L_Math.ID2I(abid)) 
            //console.log("---技能:",abid)
        }
    }

    //后添加负数技能 防止力量改变意外死亡等
    if (v<0) {
        UnitAddAbility(unitHandle,L_Math.ID2I(mabid))     
        //console.log("负数修正+++技能:",mabid)
    }
}



}
